package com.easychat.redis;

import com.easychat.dto.SysSettingDto;
import com.easychat.dto.TokenUserInfoDto;
import com.easychat.entity.constants.Constants;
import com.easychat.utils.RedisUtil;
import com.easychat.utils.StringTools;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author 10 2024/10/5
 */
@Component("redisComponent")
public class RedisComponent {
     @Resource
     private StringRedisTemplate stringRedisTemplate;
     @Resource
     private RedisTemplate redisTemplate;
     @Resource
     private RedisUtil redisUtil;

     /**
      * 获取心跳
      * @param userId
      * @return
      */
     public Long getUserHeartBeat(String userId){
          String string = stringRedisTemplate.opsForValue().get(Constants.REDIS_KEY_WS_USER_HEART_BEAT + userId);
          Long hearBeat = null;
          if(!StringTools.isEmpty(string)){

               hearBeat = Long.parseLong(string);
          }
          return hearBeat;

     }

     public void saveUserHeartBeat(String userId){
        redisTemplate.opsForValue().set(Constants.REDIS_KEY_WS_USER_HEART_BEAT + userId,System.currentTimeMillis(),Constants.REDIS_KEY_EXPIRES_HEART_BEAT,TimeUnit.SECONDS);

     }

     public void removeUserHeartBeat(String userId){
          redisTemplate.delete(Constants.REDIS_KEY_WS_USER_HEART_BEAT + userId);
     }
     public void saveTokenUserInfoDto(TokenUserInfoDto tokenUserInfoDto){
          redisTemplate.opsForValue().set(Constants.REDIS_KEY_WS_TOKEN + tokenUserInfoDto.getToken() ,tokenUserInfoDto,Constants.REDIS_KEY_EXPIRES_DAY*2, TimeUnit.SECONDS);
          redisTemplate.opsForValue().set(Constants.REDIS_KEY_WS_TOKEN_USERID + tokenUserInfoDto.getUserId() ,tokenUserInfoDto.getToken(),Constants.REDIS_KEY_EXPIRES_DAY*2,TimeUnit.SECONDS);
     }
     public SysSettingDto getSysSetting(){
          SysSettingDto sysSettingDto = (SysSettingDto) redisTemplate.opsForValue().get(Constants.REDIS_KEY_SYS_SETTING);
          sysSettingDto = sysSettingDto == null ? new SysSettingDto():sysSettingDto;
          return sysSettingDto;

     }

     public void saveSysSetting(SysSettingDto sysSettingDto) {
          redisTemplate.opsForValue().set(Constants.REDIS_KEY_SYS_SETTING,sysSettingDto);
     }

     public TokenUserInfoDto getTokenUserInfoDto(String token){
          TokenUserInfoDto tokenUserInfoDto = (TokenUserInfoDto) redisTemplate.opsForValue().get(Constants.REDIS_KEY_WS_TOKEN + token);
          return tokenUserInfoDto;
     }
     public void cleanUserTokenByUserId(String userId){
          String token = (String) redisTemplate.opsForValue().get(Constants.REDIS_KEY_WS_TOKEN_USERID + userId);
          if(StringTools.isEmpty(token)){
               return;
          }
          redisTemplate.delete(Constants.REDIS_KEY_WS_TOKEN + token);

     }

     //批量添加联系人到redis
     public void addUserContactBatch(String userId, List<String> contactIdList){
          redisUtil.lpushAll(Constants.REDIS_KEY_USER_CONTACT+userId,contactIdList,Constants.REDIS_KEY_EXPIRES_DAY);
     }

     /**
      * 添加联系人
      * @param userId
      * @param contactId
      */
     public void addUserContact(String userId,String contactId) {
          List<String> userContactList = getUserContactList(userId);
          if(userContactList.contains(contactId)){
               return;
          }
          redisUtil.lpushAll(Constants.REDIS_KEY_USER_CONTACT+userId,contactId,Constants.REDIS_KEY_EXPIRES_DAY);

     }
     //清空联系人
     public void cleanUserContact(String userId){
          redisTemplate.delete(Constants.REDIS_KEY_USER_CONTACT+userId);
     }

     public List<String> getUserContactList(String userId){
          return (List<String>) redisUtil.rpopAll(userId);
     }

     public TokenUserInfoDto getTokenUserInfoByUserId(String userId) {
          String token =(String) redisTemplate.opsForValue().get(Constants.REDIS_KEY_WS_TOKEN_USERID + userId);
          return getTokenUserInfoDto(token);
     }

     /**
      * 删除联系人
      * @param userId
      * @param contactId
      */
     public void removeUserContact(String userId,String contactId) {
          redisUtil.remove(Constants.REDIS_KEY_USER_CONTACT+userId,contactId);

     }
}
